/**
 * 诊断管理员登录问题的脚本
 * 使用方法: node scripts/diagnose-admin.js
 */

const db = require('../config/db');
const { md5WithSalt } = require('../utils/md5Util');

async function diagnose() {
  try {
    console.log('🔍 开始诊断管理员登录问题...\n');
    
    // 1. 检查数据库连接
    console.log('1️⃣ 检查数据库连接...');
    try {
      const [test] = await db.pool.query('SELECT 1 as test');
      console.log('   ✅ 数据库连接正常\n');
    } catch (err) {
      console.error('   ❌ 数据库连接失败:', err.message);
      process.exit(1);
    }
    
    // 2. 检查 users 表是否存在
    console.log('2️⃣ 检查 users 表...');
    try {
      const [tables] = await db.pool.query(
        "SHOW TABLES LIKE 'users'"
      );
      if (tables.length === 0) {
        console.error('   ❌ users 表不存在！');
        process.exit(1);
      }
      console.log('   ✅ users 表存在\n');
    } catch (err) {
      console.error('   ❌ 检查表失败:', err.message);
      process.exit(1);
    }
    
    // 3. 检查表结构
    console.log('3️⃣ 检查 users 表结构...');
    try {
      const [columns] = await db.pool.query('DESCRIBE users');
      const columnNames = columns.map(c => c.Field);
      const required = ['id', 'username', 'password', 'user_type'];
      const missing = required.filter(col => !columnNames.includes(col));
      if (missing.length > 0) {
        console.error(`   ❌ 缺少必需的列: ${missing.join(', ')}`);
        console.log('   当前列:', columnNames.join(', '));
        process.exit(1);
      }
      console.log('   ✅ 表结构正常\n');
    } catch (err) {
      console.error('   ❌ 检查表结构失败:', err.message);
      process.exit(1);
    }
    
    // 4. 检查管理员账号
    console.log('4️⃣ 检查管理员账号...');
    const [admins] = await db.pool.query(
      "SELECT id, username, phone, user_type, password, LENGTH(password) as pwd_len FROM users WHERE username = 'admin' OR user_type = 'admin'"
    );
    
    if (admins.length === 0) {
      console.log('   ⚠️  未找到任何管理员账号');
      console.log('   🔧 正在创建默认管理员账号...');
      
      const correctHash = md5WithSalt('123456');
      await db.pool.query(
        'INSERT INTO users (phone, password, username, user_type) VALUES (?, ?, ?, ?)',
        ['', correctHash, 'admin', 'admin']
      );
      console.log('   ✅ 已创建默认管理员账号\n');
    } else {
      console.log(`   📋 找到 ${admins.length} 个相关账号:`);
      admins.forEach(admin => {
        console.log(`      - ID: ${admin.id}, 用户名: ${admin.username || 'NULL'}, 类型: ${admin.user_type}, 密码长度: ${admin.pwd_len}`);
      });
      console.log('');
    }
    
    // 5. 验证密码散列
    console.log('5️⃣ 验证密码散列...');
    const correctHash = md5WithSalt('123456');
    const salt = process.env.MD5_SALT || 'uni-app-salt';
    console.log(`   密码: 123456`);
    console.log(`   盐值: ${salt}`);
    console.log(`   正确散列: ${correctHash}`);
    console.log('');
    
    // 6. 检查并修复管理员账号
    console.log('6️⃣ 检查并修复管理员账号...');
    const [adminCheck] = await db.pool.query(
      "SELECT id, username, user_type, password FROM users WHERE username = 'admin'"
    );
    
    if (adminCheck.length === 0) {
      // 创建新管理员
      await db.pool.query(
        'INSERT INTO users (phone, password, username, user_type) VALUES (?, ?, ?, ?)',
        [null, correctHash, 'admin', 'admin']
      );
      console.log('   ✅ 已创建新管理员账号');
    } else {
      const admin = adminCheck[0];
      let needUpdate = false;
      const updates = [];
      
      if (admin.user_type !== 'admin') {
        updates.push(`user_type: '${admin.user_type}' -> 'admin'`);
        needUpdate = true;
      }
      
      if (admin.password !== correctHash) {
        updates.push('password: 已更新');
        needUpdate = true;
      }
      
      if (needUpdate) {
        await db.pool.query(
          'UPDATE users SET password = ?, user_type = ? WHERE username = ?',
          [correctHash, 'admin', 'admin']
        );
        console.log(`   ✅ 已修复管理员账号: ${updates.join(', ')}`);
      } else {
        console.log('   ✅ 管理员账号状态正常');
      }
    }
    console.log('');
    
    // 7. 最终验证
    console.log('7️⃣ 最终验证...');
    const [finalCheck] = await db.pool.query(
      'SELECT id, username, user_type FROM users WHERE username = ? AND password = ? AND user_type = ?',
      ['admin', correctHash, 'admin']
    );
    
    if (finalCheck.length > 0) {
      console.log('   ✅ 验证成功！管理员账号已就绪');
      console.log(`      ID: ${finalCheck[0].id}`);
      console.log(`      用户名: ${finalCheck[0].username}`);
      console.log(`      用户类型: ${finalCheck[0].user_type}`);
      console.log('\n   📝 登录信息:');
      console.log('      用户名: admin');
      console.log('      密码: 123456');
      console.log('      可以用于登录 IT 管理端');
    } else {
      console.error('   ❌ 验证失败！请检查数据库');
      process.exit(1);
    }
    
    await db.pool.end();
    process.exit(0);
  } catch (error) {
    console.error('❌ 诊断过程出错:', error.message);
    console.error(error);
    process.exit(1);
  }
}

// 执行
diagnose();

